package utwente.sem.eindopdracht;

import java.util.ArrayList;
import java.util.List;

/**
 * De Controller voor het MVC model. De Controller klasse houdt alle data van het systeem bij.
 * 
 * @author Richard Heijblom & Mark Wienk
 *
 */
public class Controller {
	
	//TODO: Werkplaats states implementeren
	//TODO: Status in het systeemmenu verwerken
	
	public static Controller controller;
	private AssemblageLijn[] assemblageLijnen;
	private List<Product> producten;
	private List<ProductRun> productRuns;
	private List<Onderdeel> onderdelen;
	private List<Ton> tonnen;
	
	/**
	 * De Controller voor het MVC model. De Controller klasse houdt alle data van het systeem bij.
	 */
	private Controller() {
		producten = new ArrayList<Product>();
		productRuns = new ArrayList<ProductRun>();
		onderdelen = new ArrayList<Onderdeel>();
		tonnen = new ArrayList<Ton>();
		
		assemblageLijnen = new AssemblageLijn[10];
		for(int i=0; i < assemblageLijnen.length; i++) {
			assemblageLijnen[i] = new AssemblageLijn(i);
		}
	}
	
	/**
	 * Verkrijg de singelton voor de Controller.
	 * @return het Controller object
	 */
	public static Controller getController() {
		if(controller == null) {
			controller = new Controller();
		}
		return controller;
	}
	
	/**
	 * Verkrijg een lijst met producten
	 * @return een List<Product> met producten in het systeem
	 */
	public List<Product> getProductenLijst() {
		return this.producten;
	}
	
	/**
	 * Verkrijg een lijst met product runs
	 * @return een List<ProductRun> met product runs in het systeem
	 */
	public List<ProductRun> getProductRunLijst() {
		return this.productRuns;
	}
	
	/**
	 * Verkrijg een lijst met onderdelen
	 * @return een List<Onderdeel> met onderdelen in het systeem
	 */
	public List<Onderdeel> getOnderdelenLijst() {
		return this.onderdelen;
	}
	
	/**
	 * Verkrijg een lisjt met tonnen
	 * @return een List<Ton> met tonnen in het systeem.
	 */
	public List<Ton> getTonnenLijst() {
		return this.tonnen;
	}
	
	/**
	 * Verkrijg de assemblagelijnen in het systeem
	 * @return een array van AssemblageLijn objecten
	 */
	public AssemblageLijn[] getAssemblageLijnen() {
		return this.assemblageLijnen;
	}
			
	/**
	 * Geeft het hoofdmenu voor de weer.
	 */
	public void showHoofdmenu() {
		String[] keuzeOpties = { 
				"Afsluiten",
				"Bekijk/wijzig productruns",
				"Bekijk/wijzig systeem (assemblagelijnen).",
				"Bekijk/wijzig producten."
		};
		switch(Tui.getUI().toonMenu("Kies uit de volgende opties (typ het nummer):", keuzeOpties)) {
			case 0: 
				Tui.getUI().toonBericht("Tot ziens!");
				break;
			case 1: 
				ProductRun.showMenu();
				Tui.getUI().run();
				break;
			case 2: 
				showStatusMenu();
				Tui.getUI().run();
				break;
			case 3:
				Product.showMenu();
				Tui.getUI().run();
				break;
			default : //Wordt aangeroepen wanneer er een foutieve numerieke menuoptie wordt ingevoerd.
				Tui.getUI().run();
		}
	}
	
	/**
	 * Geeft met menu voor de status opties
	 */
	public void showStatusMenu() {
		Tui.getUI().toonBericht("Status menu");
		String[] keuzeOpties = {
				"Terug naar het vorige menu",
				"Assemblagelijnen",
				"Systeem"
		};
		switch(Tui.getUI().toonMenu("Maak een keuze uit het menu", keuzeOpties)) {
		case 0:
			return;
		case 1:
			AssemblageLijn.showMenu();
			break;
		case 2:
			Tui.getUI().toonBericht("Status Weergave & Menu opties");
			//TODO: Status van het systeem.
			break;
		}	
	}
}
